Bug #508255. Remove ATK_STATE_FOCUSED state when focus jumps out. Emit
authorLi Yuan <li.yuan@sun.com>
Fri, 11 Jan 2008 09:58:34 +0000 (09:58 +0000)
committerLi Yuan <liyuan@src.gnome.org>
Fri, 11 Jan 2008 09:58:34 +0000 (09:58 +0000)
2008-01-11  Li Yuan  <li.yuan@sun.com>

        * gailtreeview.c: (gail_tree_view_real_initialize), (focus_in),
        (focus_out):
        Bug #508255. Remove ATK_STATE_FOCUSED state when focus jumps out.
        Emit "active-descendant-changed" and add ATK_STATE_FOCUSED state when
        focus comes in again.

svn path=/trunk/; revision=19351

modules/other/gail/ChangeLog
modules/other/gail/gailtreeview.c

index 5292640f967babfd19a4e2c243f789e177bd5ade..2cdbf7c4fee3db8125daef76488541a151fcc128 100644 (file)
@@ -1,3 +1,11 @@
+2008-01-11  Li Yuan  <li.yuan@sun.com>
+
+       * gailtreeview.c: (gail_tree_view_real_initialize), (focus_in),
+       (focus_out):
+       Bug #508255. Remove ATK_STATE_FOCUSED state when focus jumps out.
+       Emit "active-descendant-changed" and add ATK_STATE_FOCUSED state when
+       focus comes in again.
+
 2008-01-11  Li Yuan  <li.yuan@sun.com>
 
        * gailtreeview.c: (gail_tree_view_ref_child),
index 6b88454b388390e8532d1e47b3d4188c19b00dd1..a380dbf65d2377cac483864f5540c0e4dccb6dec 100644 (file)
@@ -194,6 +194,8 @@ static void             gail_tree_view_changed_gtk      (GtkTreeSelection
 static void             columns_changed                 (GtkTreeView            *tree_view);
 static void             cursor_changed                  (GtkTreeView            *tree_view);
 static gint             idle_cursor_changed             (gpointer               data);
+static void             focus_in                        (GtkWidget             *widget);
+static void             focus_out                       (GtkWidget              *widget);
 
 static void             model_row_changed               (GtkTreeModel           *tree_model,
                                                          GtkTreePath            *path,
@@ -469,6 +471,10 @@ gail_tree_view_real_initialize (AtkObject *obj,
     (GCallback) columns_changed, NULL, NULL, 0);
   g_signal_connect_data (tree_view, "cursor-changed",
     (GCallback) cursor_changed, NULL, NULL, 0);
+  g_signal_connect_data (GTK_WIDGET (tree_view), "focus-in-event",
+    (GCallback) focus_in, NULL, NULL, 0);
+  g_signal_connect_data (GTK_WIDGET (tree_view), "focus-out-event",
+    (GCallback) focus_out, NULL, NULL, 0);
 
   view->tree_model = tree_model;
   if (tree_model)
@@ -2649,6 +2655,55 @@ idle_cursor_changed (gpointer data)
   return FALSE;
 }
 
+static void
+focus_in (GtkWidget *widget)
+{
+  GtkTreeView *tree_view;
+  GailTreeView *gail_tree_view;
+  AtkStateSet *state_set;
+  AtkObject *cell;
+
+  tree_view = GTK_TREE_VIEW (widget);
+  gail_tree_view = GAIL_TREE_VIEW (gtk_widget_get_accessible (widget));
+
+  if (gail_tree_view->focus_cell == NULL)
+    {
+      cell = gail_tree_view_ref_focus_cell (tree_view);
+      if (cell)
+        {
+          state_set = atk_object_ref_state_set (cell);
+          if (state_set)
+            {
+              if (!atk_state_set_contains_state (state_set, ATK_STATE_FOCUSED))
+                {
+                  gail_cell_add_state (GAIL_CELL (cell), ATK_STATE_ACTIVE, FALSE);
+                  gail_tree_view->focus_cell = cell;
+                  gail_cell_add_state (GAIL_CELL (cell), ATK_STATE_FOCUSED, FALSE);
+                  g_signal_emit_by_name (gail_tree_view,
+                                         "active-descendant-changed",
+                                         cell);
+                }
+              g_object_unref (state_set);
+            }
+        }
+    }
+}
+
+static void
+focus_out (GtkWidget *widget)
+{
+  GailTreeView *gail_tree_view;
+
+  gail_tree_view = GAIL_TREE_VIEW (gtk_widget_get_accessible (widget));
+  if (gail_tree_view->focus_cell)
+  {
+    gail_cell_remove_state (GAIL_CELL (gail_tree_view->focus_cell), ATK_STATE_ACTIVE, FALSE);
+    gail_cell_remove_state (GAIL_CELL (gail_tree_view->focus_cell), ATK_STATE_FOCUSED, FALSE);
+    g_object_unref (gail_tree_view->focus_cell);
+    gail_tree_view->focus_cell = NULL;
+  }
+}
+
 static void
 model_row_changed (GtkTreeModel *tree_model,
                    GtkTreePath  *path,